package main

import "sync"

//零值 Mutex 是有效的
/*
零值 sync.Mutex 和 sync.RWMutex 是有效的。所以指向 mutex 的指针基本是不必要的。

Bad:
mu := new(sync.Mutex)
mu.Lock()

Good:
var mu sync.Mutex
mu.Lock()
*/

type smap struct {
	sync.Mutex // 嵌入，only for unexported types（仅适用于非导出类型）

	data map[string]string
}

func newSMap() *smap {
	return &smap{
		data: make(map[string]string),
	}
}

func (m *smap) Get(k string) string {
	m.Lock()
	defer m.Unlock()

	return m.data[k]
}

type SMap struct {
	mu sync.Mutex //引用， 对于导出类型，请使用私有锁

	data map[string]string
}

func NewSMap() *SMap {
	return &SMap{
		data: make(map[string]string),
	}
}

func (m *SMap) Get(k string) string {
	m.mu.Lock()
	defer m.mu.Unlock()

	return m.data[k]
}
